package jspeakserver;


import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Manuel Figueroa Recio
 */
public class Servidor implements Runnable {
    private Pila pila;     // pila de clientes
    private ServerSocket sSock;    // ServerSocket del servidor
    private Socket cliente;        // Socket del cliente
    private ObjectInputStream entrada;   // entrada
    private ObjectOutputStream salida;  // salida
    private int puerto = 2000;     // Puerto Default
    private Thread escuchaConex;   // Thread de escucha de conexiones
    //private Boolean listo = true;  // control de sincronia
    private Cliente tempCliente;   // cliente temporal
    private HiloServidor tempHilo;
    private Boolean autentificado = true; // true si es correcta la informacion. (true mientras no se implementa la bd)
    private String user; //usuario para identificar
    private String pass; //password para identificar

    public Servidor(){
        iniciarServer();
    }

    public Servidor(int puerto){
        this.puerto = puerto;
        iniciarServer();
    }

    private void iniciarServer(){
        System.out.println("El Servidor esta iniciando...");
        pila = new Pila(); //iniciamos una pila de clientes

        try {
            sSock = new ServerSocket(puerto);
            System.out.println("Iniciando servidor en la direccion " + sSock.getInetAddress() + ":" + puerto);
            // auditoria: El server inicio a las XX:XX con ip XXX.XXX.XXX.XXX en el puerto XXXX
        }
        catch (IOException ex) {
            System.out.println("ERRROR: Compruebe que el puerto no esta ocupado.");
            System.exit(1);
        }

       System.out.println("Iniciando escucha...");
       escuchaConex = new Thread(this);
       escuchaConex.start();
    }

    public void run() {
        while(true){
            try {
                System.out.println("Servidor a la espera de conexión.");
                cliente = sSock.accept(); //esperamos conexion cliente
                System.out.println("Cliente conectado: " + cliente.getInetAddress() );
            }
            catch (IOException ex) {
                System.out.println("Error estableciendo conexion con el cliente");
                System.exit(1);
            }
            try{
                entrada = new ObjectInputStream(cliente.getInputStream());  //chupamos el input
                salida = new ObjectOutputStream(cliente.getOutputStream()); //chupamos el output
                user = entrada.readUTF();
                pass = entrada.readUTF();
                // comprobar que tiene acceso en bd
                // recordar borrar user y pass despues.
            }
            catch (IOException ex) {
                autentificado = false;
            }
                if (!autentificado){
                      //Acciones pertinentes cuando no ha introducido bien el usuario.
                }
                else{
                    //salida = new ObjectOutputStream(cliente.getOutputStream()); //chupamos el output
                    // Preparamos el cliente, lo almacenamos y lanzamos el Thread que lo manejara.

                    tempCliente = new Cliente(user,pass);
                    tempHilo = new HiloServidor(tempCliente,entrada,salida,cliente,pila);

                    pila.addHilo(tempHilo);
                   
                    entrada = null; // asi me aseguro de que lo unico que apunta el stream
                    salida = null;  // es el cliente y/o hilo
                }
                //aqui comprobariamos en bd si es correcto.


        }
    }


    
}
